package cn.sjxy.apiAdmin;

import cn.sjxy.baseLib.AjaxResult;
import cn.sjxy.baseLib.SjuException;
import cn.sjxy.baseLib.SjuSecurity;
import cn.sjxy.baseLib.SjuTool;
import cn.sjxy.config.mvcExtend.NeedAdminLogin;
import cn.sjxy.mapper.Mp_User;
import cn.sjxy.model.Md_User;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.Date;

/**
 * 管理员端 - 用户管理API
 */
@RestController
@Validated
@Api(tags = "管理员端-用户管理")
public class Ad_User {

    @Autowired
    private Mp_User mp_user;

    /**
     * 获取用户列表（分页）
     *
     * @param userCode  用户账号（模糊查询）
     * @param userName  用户名称（模糊查询）
     * @param pageIndex 页码
     * @param pageSize  每页数量
     * @return
     */
    @GetMapping(value = "/admin/user/getTable")
    @ApiOperation("获取用户列表")
    @NeedAdminLogin
    public AjaxResult getTable(
            @RequestParam(required = false) String userCode,
            @RequestParam(required = false) String userName,
            @RequestParam(defaultValue = "1") Integer pageIndex,
            @RequestParam(defaultValue = "10") Integer pageSize) {

        // 构建查询条件
        QueryWrapper<Md_User> wrapper = new QueryWrapper<>();

        // 用户账号模糊查询
        if (SjuTool.isNotNull(userCode) && !userCode.trim().isEmpty()) {
            wrapper.like("userCode", userCode);
        }

        // 用户名称模糊查询
        if (SjuTool.isNotNull(userName) && !userName.trim().isEmpty()) {
            wrapper.like("userName", userName);
        }

        // 按创建时间倒序
        wrapper.orderByDesc("createDate");

        // 分页查询
        IPage<Md_User> page = new Page<>(pageIndex, pageSize);
        page = mp_user.selectPage(page, wrapper);

        // 返回结果
        AjaxResult result = AjaxResult.success("查询成功");
        result.addTable(page.getRecords());
        result.addPage(page);
        return result;
    }

    /**
     * 获取用户详情
     *
     * @param id
     * @return
     */
    @GetMapping(value = "/admin/user/getDetail")
    @ApiOperation("获取用户详情")
    @NeedAdminLogin
    public AjaxResult getDetail(@NotNull(message = "ID不能为空") Long id) {
        Md_User user = mp_user.selectById(id);
        // 清空密码字段，不返回给前端
        if (user != null) {
            user.setPassword("");
        }
        AjaxResult result = AjaxResult.success("查询成功");
        result.addKey("entry", user);
        return result;
    }

    /**
     * 新增用户
     *
     * @param user
     * @return
     * @throws Exception
     */
    @PostMapping(value = "/admin/user/insert")
    @ApiOperation("新增用户")
    @NeedAdminLogin
    public AjaxResult insert(@RequestBody Md_User user) throws Exception {
        // 检查用户账号是否已存在
        QueryWrapper<Md_User> wrapper = new QueryWrapper<>();
        wrapper.eq("userCode", user.getUserCode());
        Long count = mp_user.selectCount(wrapper);
        if (count > 0) {
            SjuException.appEx("用户账号已存在");
        }

        // 密码MD5加密
        user.setPassword(SjuSecurity.toMD5(user.getPassword()));
        user.setCreateDate(new Date());

        int result = mp_user.insert(user);
        if (result > 0) {
            return AjaxResult.success("新增成功");
        } else {
            SjuException.appEx("新增失败");
            return null;
        }
    }

    /**
     * 修改用户
     *
     * @param user
     * @return
     * @throws Exception
     */
    @PostMapping(value = "/admin/user/update")
    @ApiOperation("修改用户")
    @NeedAdminLogin
    public AjaxResult update(@RequestBody Md_User user) throws Exception {
        // 检查用户账号是否已存在（排除自己）
        QueryWrapper<Md_User> wrapper = new QueryWrapper<>();
        wrapper.eq("userCode", user.getUserCode());
        wrapper.ne("id", user.getId());
        Long count = mp_user.selectCount(wrapper);
        if (count > 0) {
            SjuException.appEx("用户账号已存在");
        }

        // 如果修改了密码，则加密
        if (SjuTool.isNotNull(user.getPassword()) && !user.getPassword().trim().isEmpty()) {
            user.setPassword(SjuSecurity.toMD5(user.getPassword()));
        } else {
            // 如果密码为空，则不修改密码
            user.setPassword(null);
        }

        int result = mp_user.updateById(user);
        if (result > 0) {
            return AjaxResult.success("修改成功");
        } else {
            SjuException.appEx("修改失败");
            return null;
        }
    }

    /**
     * 删除用户
     *
     * @param userCode
     * @return
     * @throws Exception
     */
    @PostMapping(value = "/admin/user/delete")
    @ApiOperation("删除用户")
    @NeedAdminLogin
    public AjaxResult delete(@NotBlank(message = "用户账号不能为空") String userCode) throws Exception {
        QueryWrapper<Md_User> wrapper = new QueryWrapper<>();
        wrapper.eq("userCode", userCode);
        int result = mp_user.delete(wrapper);
        if (result > 0) {
            return AjaxResult.success("删除成功");
        } else {
            SjuException.appEx("删除失败");
            return null;
        }
    }
}

